using System;
using System.Collections.Generic;
using System.Text;
using RC.ControlAcceso.BaseDatos;
using System.Data;
using RC.CodigoBarras.Utiles;

namespace RC.ControlAcceso.ObjetosNegocio
{
    public class CA2AreaDeTrabajo
    {
        #region Variables
        private int _idAreaDeTrabajo;
        private int _idCargo;
        private string _descripcion;
        private bool _estaActivo;
        
        // objeto de base de datos
        CAAreaDeTrabajoBD mAreaDeTrabajoBD;
                
        #endregion

        #region Propiedades
        
        public int IdAreaDeTrabajo
        {
            get { return _idAreaDeTrabajo; }
            set { _idAreaDeTrabajo = value; }
        }
        public int IdCargo
        {
            get { return _idCargo; }
            set { _idCargo = value; }
        }
        public string Descripcion
        {
            get { return _descripcion; }
            set { _descripcion = value; }
        }
        public bool EstaActivo
        {
            get { return _estaActivo; }
            set { _estaActivo = value; }
        }
        #endregion

        #region Constructores
        public CA2AreaDeTrabajo()
        {
            IdAreaDeTrabajo = -1;
            IdCargo = -1;
            Descripcion = "";
            EstaActivo = true;
        }        
        public CA2AreaDeTrabajo(int pIdAreaDeTrabajo)
        {
            mAreaDeTrabajoBD = new CAAreaDeTrabajoBD(pIdAreaDeTrabajo);
            AsignarBDaON();
        }
        #endregion

        #region Funciones
        
        /// <summary>
        /// Agrega un AreaDeTrabajo.
        /// </summary>
        /// <returns>No devuelve nada.</returns>
        public void Insertar()
        {            
            AsignarONaBD();
            mAreaDeTrabajoBD.IdAreaDeTrabajo =  mAreaDeTrabajoBD.Insertar();
            IdAreaDeTrabajo = mAreaDeTrabajoBD.IdAreaDeTrabajo;
        }
        /// <summary>
        /// Actualiza el objeto.
        /// </summary>
        /// <returns>No devuelve nada.</returns>
        public void Actualizar()
        {
            AsignarONaBD();
            mAreaDeTrabajoBD.Actualizar();
        }
        /// <summary>
        /// Carga un objeto.
        /// </summary>
        /// <returns>No devuelve nada.</returns>
        public void Editar()
        {
            AsignarONaBD();
            mAreaDeTrabajoBD.Editar();
            AsignarBDaON();
        }
        
        
        /// <summary>
        /// Asigna los objetos de la base de datos a el objeto de nengocio
        /// </summary>
        private void AsignarBDaON()
        {
            IdAreaDeTrabajo = mAreaDeTrabajoBD.IdAreaDeTrabajo;
            IdCargo = mAreaDeTrabajoBD.IdCargo;
            Descripcion = mAreaDeTrabajoBD.Descripcion;
            EstaActivo = mAreaDeTrabajoBD.EstaActivo;
        }
        /// <summary>
        /// Asigna los objetos de negocio a base de datos
        /// </summary>
        private void AsignarONaBD()
        {
            if (mAreaDeTrabajoBD == null)
                mAreaDeTrabajoBD = new CAAreaDeTrabajoBD();
            mAreaDeTrabajoBD.IdAreaDeTrabajo = IdAreaDeTrabajo;
            mAreaDeTrabajoBD.IdCargo = IdCargo;
            mAreaDeTrabajoBD.Descripcion = Descripcion;
            mAreaDeTrabajoBD.EstaActivo = EstaActivo;
        }
        public CA2AreaDeTrabajo AsignarRowAAreaDeTrabajo(DataRow pRow)
        {
            CA2AreaDeTrabajo _AreaDeTrabajo = new CA2AreaDeTrabajo();


            _AreaDeTrabajo.IdAreaDeTrabajo = int.Parse(pRow["IdAreaDeTrabajo"].ToString());

            try { _AreaDeTrabajo.IdCargo = int.Parse(pRow["IdCargo"].ToString()); }
            catch { _AreaDeTrabajo.IdCargo = -1; }

            _AreaDeTrabajo.Descripcion = pRow["Descripcion"].ToString();

            try { _AreaDeTrabajo.EstaActivo = bool.Parse(pRow["EstaActivo"].ToString()); }
            catch { _AreaDeTrabajo.EstaActivo = true; }

            return _AreaDeTrabajo;
        }
        #endregion
    }
    public class CA2AreaDeTrabajoColeccion : System.Collections.CollectionBase
    {
        public void Add(CA2AreaDeTrabajo pAreaDeTrabajo)
        {
            this.List.Add(pAreaDeTrabajo);
        }
        public void Remove(int index)
        {
            if (index <= Count - 1 || index >= 0)
            {
                this.List.RemoveAt(index);
            }
            else
            {
                throw new System.ArgumentException("Fuera de rango", "original");
            }
        }
        public CA2AreaDeTrabajo this[int index]
        {
            get { return ((CA2AreaDeTrabajo)(this.List[index])); }
            set { this.List[index] = value; }
        }
        
        /// <summary>
        /// Obtiene todas las AreaDeTrabajos
        /// </summary>
        public CA2AreaDeTrabajoColeccion ObtenerTodasLasAreaDeTrabajos()
        {
            CAAreaDeTrabajoBD _AreaDeTrabajo = new CAAreaDeTrabajoBD();
            DataSet _AreaDeTrabajosDS = _AreaDeTrabajo.ObtenerTodos();
            return AsignarDatasetAColeccion(_AreaDeTrabajosDS);
        }
        /// <summary>
        /// Asigna los valores del dataset a el objeto coleccion.
        /// </summary>
        /// <param name="pDSLegajos"></param>
        /// <returns></returns>
        private CA2AreaDeTrabajoColeccion AsignarDatasetAColeccion(DataSet pAreaDeTrabajosDS)
        {
            if ((pAreaDeTrabajosDS == null) || (pAreaDeTrabajosDS.Tables[0].Rows.Count == 0))
                return null;

            CA2AreaDeTrabajoColeccion _resultado = new CA2AreaDeTrabajoColeccion();
            CA2AreaDeTrabajo _AreaDeTrabajo = new CA2AreaDeTrabajo(); //lo creo aca por que tengo que usar solamente un metodo que tiene 

            // recorro todas las filas y AreaDeTrabajo los objetos
            foreach (DataRow _row in pAreaDeTrabajosDS.Tables[0].Rows)
            {
                // asigno los valores a el objeto y el objeto a la coleccion
                _resultado.Add(_AreaDeTrabajo.AsignarRowAAreaDeTrabajo(_row));
            }

            return _resultado;

        }
        /// <summary>
        /// Obtiene todas las AreaDeTrabajos activas utilizables
        /// </summary>
        /// <returns></returns>
        private CA2AreaDeTrabajoColeccion ObtenerAreaDeTrabajosActivas()
        {
            CA2AreaDeTrabajoColeccion _resultado = new CA2AreaDeTrabajoColeccion();
            foreach (CA2AreaDeTrabajo _AreaDeTrabajo in this)            
                if (_AreaDeTrabajo.EstaActivo == true)
                    _resultado.Add(_AreaDeTrabajo);

            return _resultado;
        }
        /// <summary>
        /// Devuelve el objeto AreaDeTrabajo que corresponde al nombre especificado.
        /// Si la AreaDeTrabajo no existe, devuelve Null.
        /// </summary>
        /// <param name="pNombreAreaDeTrabajo"></param>
        /// <returns></returns>
        public CA2AreaDeTrabajo ObtenerAreaDeTrabajoPorNombre(string pNombreAreaDeTrabajo)
        {
            foreach (CA2AreaDeTrabajo _AreaDeTrabajo in this)
                try
                {
                    if (_AreaDeTrabajo.Descripcion.ToUpper() == pNombreAreaDeTrabajo.ToUpper())
                        return _AreaDeTrabajo;
                }
                catch { }

            // si no lo encuentra devuelve vacio
            return null;
        }
        /// <summary>
        /// Actualiza el AreaDeTrabajo proporcionado
        /// </summary>
        /// <param name="pAreaDeTrabajo"></param>
        /// <returns></returns>
        public bool ActualizarAreaDeTrabajo(CA2AreaDeTrabajo pAreaDeTrabajo)
        {
            pAreaDeTrabajo.Actualizar();
            return true;
        }
        /// <summary>
        /// Elimina la AreaDeTrabajo seleccionada.
        /// </summary>
        /// <param name="pAreaDeTrabajo"></param>
        /// <returns></returns>
        public bool EliminarAreaDeTrabajo(CA2AreaDeTrabajo pAreaDeTrabajo)
        {
            CA2AreaDeTrabajo _AreaDeTrabajo = new CA2AreaDeTrabajo(pAreaDeTrabajo.IdAreaDeTrabajo);
            _AreaDeTrabajo.EstaActivo = false;
            _AreaDeTrabajo.Actualizar();
            return true;
        }

    }
}